package com.walle.ak47.commons.utils.json;

import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Map;

import javax.xml.datatype.XMLGregorianCalendar;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
import com.walle.ak47.commons.utils.IOUtils;

public class GBuilder {

	public static Gson gson() {
		return new GsonBuilder().setPrettyPrinting()
				.setDateFormat("yyyy-MM-dd HH:mm:ss")
				.registerTypeAdapter(XMLGregorianCalendar.class,new XMLGregorianCalendarAdapter())
				.create();
	}
	
	public static Gson gsonNoFormate() {
		return new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")
				.registerTypeAdapter(XMLGregorianCalendar.class,new XMLGregorianCalendarAdapter())
				.create();
	}
	
	public static String toJson( Object src ) {
		return new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")
				.registerTypeAdapter(XMLGregorianCalendar.class,new XMLGregorianCalendarAdapter())
				.create().toJson(src);
	}
	

	public static <T> T fromJson( String filePath, Type typeOfT) throws JsonSyntaxException, IOException {
		return GBuilder.gson().fromJson(IOUtils.toString(new FileReader( filePath )), typeOfT);
	}
	
	public static Map<String,String> fromJson( String message )
	{
		return GBuilder.gson().fromJson( message, new TypeToken<Map<String,String>>(){}.getType() ) ;
	}
	
	public static Map<String,Object> fromJson_( String message )
	{
		return GBuilder.gson().fromJson( message, new TypeToken<Map<String,Object>>(){}.getType() ) ;
	}
	
	public static String formatStr( String message )
	{
		Gson gson3 = new GsonBuilder().setPrettyPrinting().create();
		JsonParser jp = new JsonParser();
		JsonElement je = jp.parse( message );
		return gson3.toJson(je); 
	}
	
	public static JsonObject getJsonObject( String json )
	{
		JsonParser parser = new JsonParser();
		JsonElement element = parser.parse(json) ;
		if ( element.isJsonObject() ) 
			return element.getAsJsonObject() ;
		else
			return null ;
	}
	
	public static JsonArray getJsonArray( String json )
	{
		JsonParser parser = new JsonParser();
		JsonElement element = parser.parse(json) ;
		if ( element.isJsonArray() ) 
			return element.getAsJsonArray() ;
		else
			return null ;
	}
	
	public static JsonPrimitive getJsonPrimitive( String json )
	{
		JsonParser parser = new JsonParser();
		JsonElement element = parser.parse(json) ;
		if ( element.isJsonPrimitive() ) 
			return element.getAsJsonPrimitive() ;
		else
			return null ;
	}
	
	public static JsonNull getJsonNull( String json )
	{
		JsonParser parser = new JsonParser();
		JsonElement element = parser.parse(json) ;
		if ( element.isJsonNull() ) 
			return element.getAsJsonNull() ;
		else
			return null ;
	}
}
